* lisp/progmodes/xref.el (xref-revert-buffer-restore-point): New function.
authorJuri Linkov <juri@linkov.net>
Thu, 27 Jun 2024 06:42:34 +0000 (09:42 +0300)
committerJuri Linkov <juri@linkov.net>
Thu, 27 Jun 2024 06:42:34 +0000 (09:42 +0300)
(xref--xref-buffer-mode): Add xref-revert-buffer-restore-point
to revert-buffer-restore-functions (bug#71466).

lisp/progmodes/xref.el

index 0b0699414386728439427d9011b04dda53b74340..710293b8dbcc84f5c077197d8694eaa2d344a950 100644 (file)
@@ -1017,7 +1017,9 @@ point."
               (lambda (&optional bound move backward looking-at)
                 (outline-search-text-property
                  'xref-group nil bound move backward looking-at)))
-  (setq-local outline-level (lambda () 1)))
+  (setq-local outline-level (lambda () 1))
+  (add-hook 'revert-buffer-restore-functions
+            #'xref-revert-buffer-restore-point nil t))
 
 (defvar xref--transient-buffer-mode-map
   (let ((map (make-sparse-keymap)))
@@ -1293,6 +1295,25 @@ Return an alist of the form ((GROUP . (XREF ...)) ...)."
 ;;; FIXME: Make this alias obsolete in future release.
 (defalias 'xref-revert-buffer #'revert-buffer)
 
+(defun xref-revert-buffer-restore-point ()
+  "Restore point on a previous item or group after reverting."
+  (let* ((item
+          (when (xref--item-at-point)
+            (buffer-substring-no-properties (pos-bol) (pos-eol))))
+         (group
+          (save-excursion
+            (when (or (get-text-property (point) 'xref-group)
+                      (and item (xref--search-property 'xref-group t)
+                           (get-text-property (point) 'xref-group)))
+              (buffer-substring-no-properties (pos-bol) (pos-eol))))))
+    (when (or item group)
+      (lambda ()
+        (goto-char (point-min))
+        (when (and group (search-forward (concat "\n" group "\n") nil t))
+          (goto-char (pos-bol 0)))
+        (when (and item (search-forward (concat "\n" item "\n") nil t))
+          (goto-char (pos-bol 0)))))))
+
 (defun xref--auto-jump-first (buf value)
   (when value
     (select-window (get-buffer-window buf))